'''
作者: 李凌飞
日期: 2025-04-06
描述: 此脚本用于比较两个文件夹中的文件，并移除重复文件。
      通过忽略文件后缀名的方式进行比较，主要用于处理不同格式但内容相关的文件。
版本: 1.0
'''

'''
两个文件夹时，需要去除文件后缀名，只比较文件名，因为可能需要对比的文件是处理之后的文件，后缀名不一样。
需要修改：
第39行的文件后缀名类型，如果两个文件夹中存放的文件类型变化。
第40行的文件后缀名类型，如果两个文件夹中存放的文件类型变化。
'''
import os
import shutil
from pathlib import Path
import logging

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

def get_name_without_extension(filename):
    """
    获取不带后缀的文件名
    """
    return os.path.splitext(filename)[0]

def compare_and_remove_duplicates(left_dir, right_dir):
    """
    比较两个文件夹,从left_dir中删除在right_dir中已存在的文件（忽略后缀名）
    
    Args:
        left_dir: 需要清理的文件夹路径（存放.json文件）
        right_dir: 用于比较的文件夹路径（存放.md文件）
    """
    try:
        left_path = Path(left_dir)
        right_path = Path(right_dir)
        
        if not left_path.exists() or not right_path.exists():
            logger.error("文件夹路径不存在")
            return
            
        # 获取两个文件夹中的所有文件，使用不带后缀的文件名作为键
        left_files = {get_name_without_extension(f.name): f for f in left_path.rglob("*") if f.is_file() and f.suffix.lower() == '.md'}
        right_files = {get_name_without_extension(f.name): f for f in right_path.rglob("*") if f.is_file() and f.suffix.lower() == '.json'}
        
        # 统计计数
        removed_count = 0
        total_files = len(left_files)
        
        # 遍历left文件夹中的文件
        for filename_no_ext in left_files:
            if filename_no_ext in right_files:
                try:
                    # 删除重复文件
                    left_files[filename_no_ext].unlink()
                    removed_count += 1
                    logger.info(f"已删除重复文件: {left_files[filename_no_ext].name}")
                except Exception as e:
                    logger.error(f"删除文件 {left_files[filename_no_ext].name} 时出错: {str(e)}")
                    
        logger.info(f"处理完成! 总文件数: {total_files}, 删除重复文件数: {removed_count}")
        
    except Exception as e:
        logger.error(f"比较文件夹时出错: {str(e)}")

if __name__ == "__main__":
    '''
    使用方法：
    比较两个文件夹中的文件（忽略后缀名）：
    - left_dir: 存放.json文件的文件夹，将从这里删除重复文件
    - right_dir: 存放.md文件的文件夹，作为参照不会删除
    '''
    left_dir = r"C:\Users\lenovo\Desktop\待处理"
    right_dir = r"C:\Users\lenovo\Desktop\md转Json"
    
    logger.info("开始比较文件夹...")
    compare_and_remove_duplicates(left_dir, right_dir)
